#include <iostream>
using std::cout;
using std::endl;

struct FFF{
/* private: */
    void print(){
        cout << "FFF print()" << endl;
    }
    void display(){
        cout << "FFF display()" << endl;
    }
};

void print(){
    cout << "print()" << endl;
}
void display(){
    cout << "display()" << endl;
}

typedef void(*Function)();
//作用域限定在前面 指针声明在后面
//此成员函数声明需要在类的声明之下
//创建这个类型的时候已经确定了只能指向FFF的
//返回类型为void，不用手动给参数的成员函数
typedef void(FFF::*MemberFunction)();

void test0(){
    Function fo = print;
    fo();
    fo = display;
    fo();
}

void test1(){
    //print需要是FFF里的public函数
    //如果print是FFF的私有成员函数，不能用指针指向它
    MemberFunction fo = &FFF::print;
//调用FFF的成员函数print时应该通过对象调用
//那么同样，要用fo调用print时，也需要通过对象
    FFF fff;
    // .*  成员指针访问运算符
    (fff.*fo)();
}

void test2(){
    //->*  和 .* 是成员指针访问运算符的两种形式
    //这里的成员指针主要表示的是右操作数是一个指向成员函数的指针
    MemberFunction fo = &FFF::print;
    FFF * fp = new FFF;
    (fp->*fo)();

    cout << endl;
    fp = nullptr;
    (fp->*fo)();

}

int main(void){
    /* test0(); */
    /* test1(); */
    test2();
    return 0;
}
